import router from '@/router/index';
import pinia from '@/store/createPiniaStore';
import { useUserStore } from '@/store/user';
import { message } from 'ant-design-vue';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import { toRaw } from 'vue';

// 用户信息数据仓库
const userStore = useUserStore(pinia);

/**
 * 路由前置守卫
 */
router.beforeEach(async (to, from , next) => {
  // 进度条开始
  // NProgress.start();
  // 1.获取用户信息
  const userInfo =  toRaw(userStore.userInfo);
  // 身份（1管理员，0员工，-1没有获取用户信息）
  const identity = userInfo.identity;
  const token = sessionStorage.getItem('token');
  // 2.判断页面是否需要鉴权
  if (to.meta.auth) {
    // 3.判断是否有用户信息（管理员1，普通员工0，-1没有获取用户信息）
    if (userInfo && identity !== -1) {
      // 暂时登录仅能访问，后续修改
      next();
    } else {
      // 没有用户信息，看本地有没有存储token
      if (token) {
        // 有token，需要验证token是否有效(后续处理)
        try {
          const hasUserInfo = await userStore.actionGetUserInfo(token);
          if (hasUserInfo) {
            // 可以token中解析出用户信息
            const routeListStr = sessionStorage.getItem("routeList") || "";
            const routeList = JSON.parse(routeListStr) || [];
            const has = routeList.some((it: { route: string; }) => it.route === location.pathname);
            if (has) {
              next();
            }
            next({path: '/404'})
          }
        } catch (error) {
          // 重置本地token，重新登录
          await userStore.actionResetToken();
          message.error('登录已过期，请重新登录');
          next(`/user/login?redirect=${to.path}`);
          // NProgress.done();
        }
      } else {
        // 没有token，需要重新登录
        message.error('登录已过期，请重新登录');
        next({path:'/user/login'})
        // NProgress.done();
      }
    }
  } else {
    // 不需要鉴权的页面
    if (to.path === '/user/login' && token) {
      // 已经登录的用户去访问登录页，导航去首页
      // console.log(sessionStorage.getItem('routeList'),'route', typeof sessionStorage.getItem('routeList'));
      const routeListStr = sessionStorage.getItem('routeList') || "";
      const routeList = JSON.parse(routeListStr) || [];
      next({path: routeList[0].route});
    } else {
      next();
    }
    // 进度条结束
    // NProgress.done();
  }
});

/**
 * 路由后置守卫
 */
router.afterEach(() => {
  // 进度条结束
  // NProgress.done();
});
